
import java.awt.image.TileObserver;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.security.Timestamp;
import java.sql.Time;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;

public class Utils {
	/*
	Classe utilitaire 

	 */
	//public static String log_name="console";

	
	public static String log_name=("console");
	public static String chemin = "/home/pacoste/Bureau/Simmax/log/";        // Repertoire de log (mettre le slash à la fin)
	public static int user_curseur; // 
	public static int client_trasmission_limit;
	public static boolean start;
	public static int nb_client ; 
	public static int nb_tr ; 
	public static int wmax ; 
	public static int cdmamax;
	public static int nb_freq=16;
	public static int pos_curseur ; // la position du curseur (taille de DL_Sub Frame) on initialise a 24 juste pour le premier lancement du programme
	public static int tradeoff_activity=3; // parametre de reactivite du curseur (toutes les x trame, la fction sera execute)
	public static int min_debit_BE=2; // debit minimum des BE
	public static int nb_demande_acces;
	public static int total_collisions=0;
	public static int log ;
	// fixe les bornes du curseur 
	//public static int max_curseur=28;try {Utils.writeF(Utils.cdmamax+";"+Utils.total_collisions, "collisions_cdma");} 
	
	public static int nb_rejets=0; 
	
	public static ArrayList<Client> client_liste = new ArrayList<Client>(); 
	public static ArrayList<Integer> collision_by_slot = new ArrayList<Integer>();	// liste des id qui on fait des collisions
	public static ArrayList<Integer> collision_by_trame = new ArrayList<Integer>();
	
	public static HashMap<Integer, Integer> emissions_client = new HashMap<Integer,Integer>();	//Table des emissions des clients pour 1 slot de temps 
	// creation de la table des enregistrement d emissions client
	public static HashMap<Integer, Integer> slot_emission = new HashMap<Integer, Integer>();
// hashmap qui servira pour l ecoute du canal, occupe ou pas 

	

	
	//====================================================================
	public ArrayList<Client> get_tab_client(){

		return this.client_liste;
	}
	//====================================================================
	public static ArrayList<Client> make_client(int nb){

		for (int i=0;i<nb;i++ ){
			Client cl= new Client(	random(1, 100000),			// id
									random(1, 10000),			// id connexion
									random(0, 2),				// etat
									random(1, 2),				// classe de service
									random(10, 50),			// Taux d'activité
									random(0, 10),				// localisation
									random(2, Utils.cdmamax),	// Code CDMA
									random(10, 50),			// Nb data à telecharger
									random(10, 50));			// Taux d'activité
			client_liste.add(cl);
		}
		return client_liste;
	}
	//====================================================================
	public static int random(int low, int high){
		
		high=high+1;
		

		return (int)(Math.random() * (high-low)) + low;
	}
	//====================================================================
	public static String make_empreinte(int id_conn, int serv_class, int loc){

		return (String.valueOf(id_conn)+ ";"+String.valueOf(serv_class)+";"+String.valueOf(loc));
	}
	//====================================================================
	public static void get_collisions() {	// Enregistre les clients qui sont entrés en collision.

		collision_by_slot.clear();
		int key, value = 0; // Pas nécessaire de mettre ces varaibles mais pour la lisibilité c'est plus facile...

		Set<Map.Entry<Integer, Integer>> set = Utils.emissions_client.entrySet();
		Set<Map.Entry<Integer, Integer>> set2 = Utils.emissions_client.entrySet();

		for (Map.Entry<Integer, Integer> clients : set) {			// Fait le tour de la map
			key   = clients.getKey();
			value = clients.getValue();

			for (Map.Entry<Integer, Integer> clients2 : set2) {		// on refait le tour de la map pour tester les valeurs.				
				if (value == clients2.getValue() && key != clients2.getKey() ) {	// on ne teste pas les mêmes bien sur.
					collision_by_slot.add(key);						// On enregistre la colision
					//System.out.println("!!! Collision entre le client " +key + " et le client " + key2 + ". cdma :"+ value2);
				}
			}	
		}

		Set nettoyageArray = new HashSet();			// Crée un Hashset pour enlever les doublons
		nettoyageArray.addAll(collision_by_slot);	// On transfert le tableau dans le hashset
		collision_by_slot.clear();					// on vide le tableau de collisions
		collision_by_slot.addAll(nettoyageArray);	// on remet le tableau propre dans collisions

		collision_by_trame.addAll(collision_by_slot);
		
		if (Utils.log==1) {
			try {Utils.writeF("Emissions client ------> "+Utils.emissions_client.toString() , "console");} 
			catch (IOException e) {e.printStackTrace();}
			////System.out.println("Emissions client ------> "+Utils.emissions_client.toString());

			try {Utils.writeF("collision by slot --------> "+Utils.collision_by_slot.toString() , "console");} 
			catch (IOException e) {e.printStackTrace();}
			////System.out.println("collision by slot --------> "+Utils.collision_by_slot.toString());

			try {Utils.writeF("collision by trame "+ Utils.collision_by_trame.toString() , "console");} 
			catch (IOException e) {e.printStackTrace();}
			////System.out.println("collision by trame "+ Utils.collision_by_trame.toString());
		}
		
	}
	//====================================================================

	public static void feed_program_from_ihm(int nb_cl, int nb_tr,int tx_limit, int cdm_max,int tradeof,int log ){
		// rempli les variables from l'interface graph
		
		Utils.nb_client= nb_cl;
		Utils.nb_tr = nb_tr;
		Utils.cdmamax=cdm_max;
		Utils.client_trasmission_limit=tx_limit;
		Utils.user_curseur=tradeof;
		Utils.log=log;
		
		try {	// écrit les parametres dans console
			Utils.writeF(	"\nnb_client = " + Utils.nb_client +
							"\nnb_trames = " + Utils.nb_tr +
							"\ncdmamax = " + Utils.cdmamax +
							"\nclient_trasmission_limit = " + Utils.client_trasmission_limit +
							"\ntradeof = " + Utils.user_curseur +"\n-----------------------------\n"
						, "console");
		} catch (IOException e) {e.printStackTrace();}
	}

	//====================================================================
	public static void writeF(String msg, String file) throws IOException {        //Ecrit dans un fichier

		FileWriter writer = new FileWriter((chemin+file),true);	// Ouvre le fichier en mode append

		if(msg==null) msg="";			// Si null on met rien...

		try {
			writer.write(msg+"\n");     // ecrit le message dans le fichier
		} catch (Exception e) {}

		writer.close();					// ferme le fichier
	}
	//====================================================================
}// end class
